package cn.iocoder.yudao.module.pay.service.point;

import javax.validation.*;

import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.pay.controller.admin.point.vo.*;
import cn.iocoder.yudao.module.pay.controller.app.point.vo.AppPayPointRechargeCreateReqVO;
import cn.iocoder.yudao.module.pay.controller.app.point.vo.AppPayPointRechargePageReqVO;
import cn.iocoder.yudao.module.pay.controller.app.point.vo.AppPayPointRechargeSaveReqVO;
import cn.iocoder.yudao.module.pay.dal.dataobject.point.PayPointRechargeDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

/**
 * 会员钻石充值 Service 接口
 *
 * @author Jerry
 */
public interface PayPointRechargeService {

    /**
     * 创建会员钻石充值
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPointRecharge(@Valid PayPointRechargeSaveReqVO createReqVO);

    /**
     * 创建钱包充值记录（发起充值）
     *
     * @param userId      用户 id
     * @param userType    用户类型
     * @param createReqVO 钱包充值请求 VO
     * @param userIp  用户Ip
     * @return 钱包充值记录
     */
    PayPointRechargeDO createPointRecharge(Long userId, Integer userType, String userIp,
                                             AppPayPointRechargeCreateReqVO reqVO);

    /**
     * 更新会员钻石充值
     *
     * @param updateReqVO 更新信息
     */
    void updatePointRecharge(@Valid PayPointRechargeSaveReqVO updateReqVO);

    /**
     * 删除会员钻石充值
     *
     * @param id 编号
     */
    void deletePointRecharge(Long id);

    /**
     * 获得会员钻石充值
     *
     * @param id 编号
     * @return 会员钻石充值
     */
    PayPointRechargeDO getPointRecharge(Long id);

    /**
     * 获得会员钻石充值分页
     *
     * @param pageReqVO 分页查询
     * @return 会员钻石充值分页
     */
    PageResult<PayPointRechargeDO> getPointRechargePage(PayPointRechargePageReqVO pageReqVO);

    /**
     * 创建会员钻石充值
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPointRecharge(@Valid AppPayPointRechargeSaveReqVO createReqVO);

    /**
     * 更新会员钻石充值
     *
     * @param updateReqVO 更新信息
     */
    void updatePointRecharge(@Valid AppPayPointRechargeSaveReqVO updateReqVO);

    /**
     * 获得会员钻石充值分页
     *
     * @param pageReqVO 分页查询
     * @return 会员钻石充值分页
     */
    PageResult<PayPointRechargeDO> getPointRechargePage(AppPayPointRechargePageReqVO pageReqVO);

    /**
     * 获得钱包充值记录分页
     *
     * @param userId 用户编号
     * @param userType 用户类型
     * @param pageReqVO 分页请求
     * @param payStatus 是否支付
     * @return 钱包充值记录分页
     */
    PageResult<PayPointRechargeDO> getPointRechargePage(Long userId, Integer userType,
                                                                 PageParam pageReqVO, Boolean payStatus);

    /**
     * 更新钱包充值成功
     *
     * @param id         钱包充值记录 id
     * @param payOrderId 支付订单 id
     */
    void updatePointRechargerPaid(Long id, Long payOrderId);
}